"use strict";
// 联合类型
//
let u;
u = "xxx";
u = 12411;
u = NaN;
function getName(animal) {
    return animal.name;
}
function isFish(animal) {
    // 断言为联合类型中的 Fish
    if (typeof animal.swim === "function") {
        return true;
    }
    return false;
}
function swim(animal) {
    animal.swim();
}
const tom = {
    name: "Tom",
    run() {
        console.log("run");
    },
};
// 类型断言只能够「欺骗」TypeScript 编译器
// 编译时不报错，无法避免运行时报错
swim(tom);
// Uncaught TypeError: animal.swim is not a function`
// 用法二：将一个父类断言为更加具体的子类
class ApiError extends Error {
    constructor() {
        super(...arguments);
        this.code = 0;
    }
}
class HttpError extends Error {
    constructor() {
        super(...arguments);
        this.statusCode = 0;
    }
}
function isApiError(error) {
    if (typeof error.code === "number") {
        return true;
    }
    return false;
}
// 用法三： 将任何一个类型断言为 any
let obj = {};
// obj.a = 100;
// error TS2339: Property 'a' does not exist on type 'object'.
// 在 any 类型的变量上，访问任何属性都是允许的。
obj.a = 1;
